home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / sbin / alsa < prev    next >
Text File  |  2009-10-11  |  6KB  |  220 lines

  1. #!/bin/sh
  2. #
  3. # alsa-base control script
  4. #
  5. # Description: Used to load and unload ALSA modules and
  6. #              restore and store mixer levels. There is no
  7. #              longer any need to run this script on bootup
  8. #              or shutdown. It ships as /sbin/alsa.
  9. ### END INIT INFO
  10.  
  11. set -e
  12.  
  13. # Exit if alsa-utils package is not installed
  14. [ -x /sbin/alsactl ] || exit 0
  15.  
  16. MYNAME=/sbin/alsa
  17. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  18.  
  19. # Default values of variables in /etc/default/alsa
  20. force_unload_modules_before_suspend=""
  21.  
  22. [ -f /etc/default/alsa ] && . /etc/default/alsa
  23.  
  24. # $* MESSAGE
  25. warn() { echo "${MYNAME}: Warning: $* " >&2 ; }
  26.  
  27. #
  28. # Attempt to create /var/run/alsa if it is absent.
  29. # Return true if /var/run/alsa exists after this attempt,
  30. # otherwise false.
  31. #
  32. check_run_dir()
  33.     [ -d /var/run/alsa ] && return 0
  34.     # We have no business creating /var/run if it doesn't exist
  35.     if ! [ -d /var/run ] ; then
  36.         warn "Could not create /var/run/alsa/ because /var/run/ is not present."
  37.         return 1
  38.     fi
  39.     if ! mkdir --mode=755 /var/run/alsa ; then
  40.         warn "Failed to create /var/run/alsa/."
  41.         return 1
  42.     fi
  43.     [ -d /var/run/alsa ] && return 0
  44.     return 1
  45. }
  46.  
  47. echo_procs_using_sound()
  48. {
  49.     echo $( \
  50.         lsof +D /dev -F rt \
  51.         | awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
  52.         | cut -c 2- \
  53.         | uniq \
  54.     )
  55. }
  56.  
  57. # $* [PID]...
  58. echo_with_command_names()
  59. {
  60.     [ "$1" ] || return 0
  61.     echo $( \
  62.         ps --no-headers -o "%p %c" "$@" \
  63.         | sed -e 's/\([0-9][0-9]*\) \(.*\)/\1(\2)/' \
  64.     )
  65. }
  66.  
  67. kill_procs_using_sound()
  68. {
  69.     procs_using_sound="$(echo_procs_using_sound)"
  70.     if [ "$procs_using_sound" ] ; then
  71.         echo -n "Terminating processes:"
  72.         for attempt in 1 2 3 4 ; do
  73.             echo -n " ${procs_using_sound}"
  74.             kill $procs_using_sound || :
  75.             sleep 1
  76.             procs_using_sound="$(echo_procs_using_sound)"
  77.             [ "$procs_using_sound" ] || break
  78.         done
  79.         # Either no more procs using sound or attempts ran out
  80.         if [ "$procs_using_sound" ] ; then
  81.             echo -n " (with SIGKILL:) ${procs_using_sound}"
  82.             kill -9 $procs_using_sound || :
  83.             sleep 1
  84.         fi
  85.         procs_using_sound="$(echo_procs_using_sound)"
  86.         if [ "$procs_using_sound" ] ; then
  87.             echo " (failed: processes still using sound devices: $(echo_with_command_names $procs_using_sound))."
  88.             return 1
  89.         fi
  90.         echo "."
  91.     fi
  92.     return 0
  93. }
  94.  
  95. # $* MODULE-NAME [MODULE-NAME]... | "all"
  96. unload_modules()
  97. {
  98.     procs_using_sound="$(echo_procs_using_sound)"
  99.     if [ "$procs_using_sound" ] ; then
  100.         warn "Processes using sound devices: $(echo_with_command_names $procs_using_sound)."
  101.     fi
  102.     if check_run_dir ; then
  103.         :> /var/run/alsa/modules-removed
  104.     else
  105.         warn "Not keeping list of removed modules because /var/run/alsa is absent.
  106. It will not be possible automatically to reload these modules."
  107.     fi
  108.     echo -n "Unloading ALSA sound driver modules:"
  109.     [ -d /proc/asound ] || { echo " (none loaded)." ; return 0 ; }
  110.     echo_snd_modules_loaded()
  111.     {
  112.         lsmod \
  113.         | sed -n -e 's/^\(snd[-_][^[:space:]]*\)[[:space:]].*/\1/p' \
  114.         | sed -e 's/_/-/g'
  115.     }
  116.     for FSMBS in $* ; do
  117.         MODULES_TO_REMOVE=""
  118.         SND_MODULES_LOADED="$(echo_snd_modules_loaded)"
  119.         case "$FSMBS" in
  120.           all)
  121.             MODULES_TO_REMOVE="$SND_MODULES_LOADED"
  122.             ;;
  123.           snd_*|snd-*)
  124.             FSMBS="$(echo "$FSMBS" | sed -e 's/_/-/g')"
  125.             for M in $SND_MODULES_LOADED ; do
  126.                 if [ "$FSMBS" = "$M" ] ; then
  127.                     MODULES_TO_REMOVE="$FSMBS"
  128.                     break
  129.                 fi
  130.             done
  131.             ;;
  132.         esac
  133.         [ "$MODULES_TO_REMOVE" ] || continue
  134.         echo "$MODULES_TO_REMOVE" >> /var/run/alsa/modules-removed
  135.         for M in $MODULES_TO_REMOVE ; do
  136.             echo -n " ${M}"
  137.             modprobe -r "$M" >/dev/null 2>&1 || :
  138.         done
  139.     done
  140.     if [ -f /var/run/alsa/modules-removed ] ; then
  141.         MODULES_STILL_LOADED="$(echo_snd_modules_loaded | grep -F -f /var/run/alsa/modules-removed)"
  142.         MODULES_STILL_LOADED="$(echo $MODULES_STILL_LOADED)"
  143.     else
  144.         MODULES_STILL_LOADED=""
  145.     fi
  146.     if [ "$MODULES_STILL_LOADED" ] ; then
  147.         echo " (failed: modules still loaded: ${MODULES_STILL_LOADED})."
  148.         return 1
  149.     else
  150.         echo "."
  151.         return 0
  152.     fi
  153. }
  154.  
  155. # $* MODULE-NAME [MODULE-NAME]... | "all"
  156. force_unload_modules()
  157. {
  158.     kill_procs_using_sound || :
  159.     unload_modules "$@" || return 1
  160.     return 0
  161. }
  162.  
  163. load_unloaded_modules()
  164. {
  165.     LUM_RETURNSTATUS=0
  166.     MODULES_TO_LOAD=""
  167.     [ -d /var/run/alsa ] || mkdir -p /var/run/alsa
  168.     echo -n "Loading ALSA sound driver modules:"
  169.     [ -f /var/run/alsa/modules-removed ] && MODULES_TO_LOAD="$(echo $(cat /var/run/alsa/modules-removed))"
  170.     [ "$MODULES_TO_LOAD" ] || { echo " (none to reload)." ; return $LUM_RETURNSTATUS ; }
  171.     echo -n " $MODULES_TO_LOAD"
  172.     for MDL in $MODULES_TO_LOAD ; do
  173.         modprobe $MDL || LUM_RETURNSTATUS=1
  174.     done
  175.     case "$LUM_RETURNSTATUS" in
  176.       0) echo "." ;;
  177.       *) echo " (failed)." ;;
  178.     esac
  179.     return $LUM_RETURNSTATUS
  180. }
  181.  
  182. case "$1" in
  183.   unload)
  184.     unload_modules all || exit $?
  185.     ;;
  186.   reload)
  187.     EXITSTATUS=0
  188.     unload_modules all || EXITSTATUS=1
  189.     load_unloaded_modules || EXITSTATUS=1
  190.     exit $EXITSTATUS
  191.     ;;
  192.   force-unload)
  193.     force_unload_modules all || exit $?
  194.     ;;
  195.   force-reload)
  196.     EXITSTATUS=0
  197.     force_unload_modules all || EXITSTATUS=1
  198.     load_unloaded_modules || EXITSTATUS=1
  199.     exit $EXITSTATUS
  200.     ;;
  201.   suspend)
  202.     case "$force_unload_modules_before_suspend" in
  203.       ""|false) : ;;
  204.       all|true) /sbin/alsactl store && force_unload_modules all || exit $? ;;
  205.       *) /sbin/alsactl store && force_unload_modules $force_unload_modules_before_suspend || exit $? ;;
  206.     esac
  207.     ;;
  208.   resume)
  209.     case "$force_unload_modules_before_suspend" in
  210.       ""|false) : ;;
  211.       *) load_unloaded_modules && /sbin/alsactl restore || exit $? ;;
  212.     esac
  213.     ;;
  214.   *)
  215.     echo "Usage: $MYNAME {unload|reload|force-unload|force-reload|suspend|resume}" >&2
  216.     exit 3
  217.     ;;
  218. esac
  219.